前言:
到了要開始處理資料的部分,因為影像資料會有檔案太大或是大小不一的問題,所以都要先預設成固定的格式來模擬訓練
程式碼:
方案一
train = tfds.load('mnist', split='train', as_supervised=True) #訓練資料
test = tfds.load('mnist', split='test', as_supervised=True) #測試資料
def format_image(image, label):
image = tf.cast(image, dtype=tf.float32)
image = image / 255.0
return image, label
BATCH_SIZE = 32
BUFFER_SIZE = 10000
train_batches = train.cache().shuffle(BUFFER_SIZE).map(format_image).batch(BATCH_SIZE).prefetch(1)
test_batches = test.cache().map(format_image).batch(BATCH_SIZE).prefetch(1)
cache: 將資料全部載入快取記憶體,可加速模型訓練
shuffle: 洗牌以打亂資料順序
map: 使用某個函數來處理資料,這裡用到的是自己寫的 format_image 函數
batch: 將數個資料組成一個批次,這裡一批包含 32 個樣本: (image, label)
prefetch: 在 GPU 或 TPU 訓練資料的過程,預先用 CPU 準備好下一批資料,可加速訓練過程
(TPU)張量處理單元:是一種定製化的 ASIC 晶片,為谷歌的主要產品提供了計算支持,包括翻譯、照片、搜索助理和 Gmail 等,並專門用於機器學習工作負載
方案二
# 資料路徑
DATASET_PATH = 'D://20210901/Demo1/dogImages'
# 影像大小
IMAGE_SIZE = (224, 224)
# 影像類別數
NUM_CLASSES = 2
# 若 GPU 記憶體不足,可調降 batch size 或凍結更多層網路
BATCH_SIZE = 8
# 凍結網路層數
FREEZE_LAYERS = 2
# Epoch 數
NUM_EPOCHS = 20
# 模型輸出儲存的檔案
WEIGHTS_FINAL = 'model-resnet50-final.h5'
# 透過 data augmentation 產生訓練與驗證用的影像資料
train_datagen = ImageDataGenerator(rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
channel_shift_range=10,
horizontal_flip=True,
fill_mode='nearest')
train_batches = train_datagen.flow_from_directory(DATASET_PATH + '/train',
target_size=IMAGE_SIZE,
interpolation='bicubic',
class_mode='categorical',
shuffle=True,
batch_size=BATCH_SIZE)
valid_datagen = ImageDataGenerator()
valid_batches = valid_datagen.flow_from_directory(DATASET_PATH + '/valid',
target_size=IMAGE_SIZE,
interpolation='bicubic',
class_mode='categorical',
shuffle=False,
batch_size=BATCH_SIZE)
# 輸出各類別的索引值
for cls, idx in train_batches.class_indices.items():
print('Class #{} = {}'.format(idx, cls))